#类
ary=["张天泽"]
print ary.class,ary[0].class,ary[1].class,"\n" #对象.class得到类名
print ary[0].instance_of?(Array),ary[0].instance_of?(String),"\n" # instance_of?方法
#继承
print ary[0].is_a?(String),ary[0].is_a?(Object),"\n" # is_a?继承

#创建自定义类
class HelloWorld
    Ver="1.0" #常量，不变
    @@count=0 #类变量，所有实例共用
    def initialize(myname="Ruby") #实例方法 iniialize
        @name=myname #实例变量 @name
    end
    #无法外部读写内部变量
    def name
        @name
    end
    def name=(value) # John.name="张天泽"
        @name=value
    end
    #以上两个可以用 attr_accessor:name 解决
    #定义内部变量：attr_accessor(读写)，attr_reader,attr_writer:x,:y
    def hello
        @@count+=1
        puts "HelloWorld,#{@name}" #不依赖于attr_reader
    end
    def greet
        @@count+=1
        puts "Hi,I'm #{self.name}" #依赖于attr_reader,self可省
    end
    class<<self #定义类方法
        def ClassMethod
            @@count+=1
            puts "Hello"
        end
    end
    def HelloWorld.ClassMethod_1 #定义类方法
        @@count+=1
        puts "hello"
    end
    def self.count #定义类方法
        @@count
    end
end
John=HelloWorld.new("John")
John.hello
HelloWorld.ClassMethod
p HelloWorld.count

#限制方法调用
class AccTest
    def pub
        puts "Method pub is public"
    end
    public:pub #默认，但是initialize是private
    def priv
        puts "Method priv is private"
    end
    private:priv #只能使用缺省接受者的方法调用，无法从实例外部访问
    attr_accessor:x,:y
    protected:x=,y= #在同一个类时作为实例方法调用
=begin
class Acctest
    public #不指定参数时以下的方法都被定义为public
    def sub
    end

    private #不指定参数时以下的方法都被定义为private
    def priv
    end
=end
    def initialize(x=0.0,y=0.0)
        @x,@y=x,y
    end
    def swap(p)
        tx,ty=@x,@y
        @x,@y=p.x,p.y
        p.x,p.y=tx,ty #同一个类中，可以被调用
        return self
    end
end
acc=AccTest.new
acc.pub
# acc.priv #=> private method `priv' called for #<AccTest:0x000000000> (NoMethodError)
p0=AccTest.new(1.0,2.0)
p1=AccTest.new(3.0,4.0)
p0.swap(p1)
p p0